package com.hfh.jdbc;

import org.junit.Test;

import java.sql.Connection;

/**
 * @Author hfh
 * @Date 2022 09 20 21 02
 **/
  /*
    模拟转账操作
    需要使用connection开启, 提交, 回滚事务
    使用ThreadLocal改进代码
     */
public class JdbcDemo2 {




    /*
    模拟转账操作
    需要使用connection开启, 提交, 回滚事务
    使用ThreadLocal改进代码
     */
    @Test
    public void transfer() throws Exception {
        int srcId = 1;
        int targetId = 2;
        int money = 500;

        Connection connection = DSUtils.getConnection();

        try {
            // 减去转出账号
            String sql = "update account set money = money + ? where id = ?";

            // 获取本次会还的连接

            // 开启事务
            connection.setAutoCommit(false);

            // 保存到线程本地变量中
            DSUtils.threadLocal.set(connection);
            DSUtils.changeRecordSafe(sql, -money, srcId);

            // 代码发生了异常
            System.out.println(1 / 0);

            // 增加转入账号
            DSUtils.changeRecordSafe(sql, money, targetId);

            // 提交事务
            connection.commit();
        } catch (Exception e) {
            e.printStackTrace();
            // 回滚事务
            DSUtils.threadLocal.get().rollback();
        } finally {
            connection.close();
        }

    }
}